package com.kamistoat.ruoyi.ruoyiapisystem.model;

import com.kamistoat.ruoyi.ruoyiapisystem.domain.SysUser;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 完整的用户令牌信息类。
 * 完整的用户令牌会被缓存在后端中，而前端只会使用到由Jwt构建的简单令牌(JwtUtils.java)。
 * 每次请求到来时，会根据前端的Jwt从缓存中提取出完整的用户令牌，然后保存在 ThreadLocal中，就和商城项目中的一模一样。
 * <p>
 * LoginUser涉及到取舍。如果在LoginUser中保存RoleIds/DeptIds等权限信息，那么在后序如果需要这些权限信息，则直接从LoginUser中拿，就不需要反复去数据库查了。
 * 但是这样的话，一旦Role/Dept本身进行修改，就需要更新缓存中的LoginUser，甚至可能需要重新登录。
 * 而如果LoginUser只用来解决自动登录，不存储任何的权限信息，就不会涉及到更新缓存的问题。
 * <p>
 * 我们这里还是选择在LoginUser中保存更多的权限信息。
 */
@Data
public class LoginUser {
    private static final long serialVersionUID = 1L;

    /**
     * 用户令牌的唯一标识--随机的token
     */
    private String token;

    /**
     * 用户名id
     */
    private Long userid;

    /**
     * 记录是否为超级管理员
     */
    private Boolean weatherAdmin = false;

    /**
     * 用户名
     */
    private String username;

    /**
     * 登录时间
     */
    private Long loginTime;

    /**
     * 过期时间
     */
    private Long expireTime;

    /**
     * 登录IP地址
     */
    private String ipaddr;

    /**
     * 权限名称列表
     */
    private List<String> permissions;

    /**
     * 权限id列表
     */
    private List<Long> permissionIds;

    /**
     * 角色名称列表
     */
    private List<String> roles;

    /**
     * 角色id列表
     */
    private List<Long> roleIds;

    /**
     * 岗位列表
     */
    private List<String> posts;
    private List<Long> postIds;

    /**
     * 用户有权限访问的部门列表、用户列表
     */
    private List<Long> allowedDeptIds;
    private List<Long> allowedUserIds;

    /**
     * 与数据库中 SysUser对应的属性。注意用的是vo类不是entity类
     */
    private SysUser sysUser;

    /**
     * 用户的额外参数表
     */
    private Map<String, Object> userParams;
}
